import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User:
 * Date: 2025-08-30
 * Time: 15:25
 */
public class demo1 {

    //2.确定一个数n，二进制中m位是0还是1
    public static void main1(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入要算的数字");
        int n = sc.nextInt();

        System.out.println("输入对应的位数");
        int m = sc.nextInt();

        System.out.println((n >> m) & 1);
    }

    //3.将一个数n中 的二进制的m位修改成1
    public static void main2(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入要算的数字");
        int n = sc.nextInt();

        System.out.println("输入对应的位数");
        int m = sc.nextInt();

        //为什么这个不行？
        //System.out.println( (n >> m) | 1);

        //数字是156，位数是6，结果为220，因为下标从0开始
        //n和 只有二进制的n位置为1 |，一定为1
        System.out.println(n |= (1 << m));
        System.out.println(n);
    }

    //4.将一个数n中 的二进制的m位修改成0
    public static void main3(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入要算的数字");
        int n = sc.nextInt();

        System.out.println("输入对应的位数");
        int m = sc.nextInt();

        //n和 只有二进制的n位置为0 & 再取反，一定为
        //0000 1000 ~= 1111 0111
        System.out.println(n &= (~(1 << m)));
        System.out.println(n);
    }

    //6.提取一个数n二进制表示中最右侧的1
    public static void main4(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入要算的数字");
        int n = sc.nextInt();

        //-n的二进制表示先把二进制n~，再+1
        //-n就是将 最右侧的1 左边的区域全部变成相反
        System.out.println(n &= (-n));
    }

    //7.干掉一个数n二进制表示中最右侧的1
    //6和7的知识点，可以用来解决leetcode上191。位1的个数，338比特位的个数，461汉名距离·
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入要算的数字");
        int n = sc.nextInt();

        //System.out.println(n &= (~(-n)));

        //n-1 将最右侧的1 右边的区域（包含1）全部变成相反
        System.out.println(n &= (n-1));

    }
}
